--local key = KEYS[1]
--local key_req = KEYS[2]
--local key_resp = KEYS[3]
local arg_seq = tonumber(ARGV[1])
local arg_data = ARGV[2]
local arg_timeoutTime = ARGV[3]

--local seq = redis.call('hget', KEYS[1], 'reqSeq') --key
--if seq == false then
--    return { err = 'offline' }
--end
--seq = tonumber(seq)
--if (arg_seq > seq + 1) then
--    return { err = 'over seq' }
--end
--if (arg_seq <= seq) then
--    local reqLen = redis.call('llen', KEYS[2]) --key_req
--    if (reqLen <= seq - arg_seq) then
--        return { err = 'lost seq' }
--    end
--    local resp = redis.call('hget', KEYS[3], arg_seq) --key_resp
--    if resp == false then
--        return "waiting"
--    end
--    return resp
--end
--redis.call('hset', KEYS[1], 'reqSeq', arg_seq) --key
--redis.call('rpush', KEYS[2], arg_data) --key_req
--local reqLen = redis.call('llen', KEYS[2]) --key_req
--if reqLen > 5 then
--    redis.call('ltrim', KEYS[2], -5, -1) --key_req
--    for i = arg_seq - reqLen, arg_seq - 5 do
--        redis.call('hdel', KEYS[3], i) --key_resp
--    end
--end

local ok = redis.call('HSETNX', KEYS[2], arg_seq, arg_data) --key_req
if ok == 0 then
    local resp = redis.call('hget', KEYS[3], arg_seq) --key_resp
    if resp == false then
        return "waiting"
    end
    return resp
end
local seq = arg_seq - 5
while (seq > 0 and redis.call("HLEN", KEYS[2]) > 5) do
    redis.call("HDEL", KEYS[2], seq)
    redis.call("HDEL", KEYS[3], seq)
    seq = seq - 1
end

redis.call('EXPIRE', KEYS[1], arg_timeoutTime) --key
redis.call('EXPIRE', KEYS[2], arg_timeoutTime) --key_req
redis.call('EXPIRE', KEYS[3], arg_timeoutTime) --key_resp

return 'ok'